package araujoCoronelVillamayor.plantasVsZombies.domain;

import araujoCoronelVillamayor.plantasVsZombies.appModelsArena.AtaqueAppModel;
import araujoCoronelVillamayor.plantasVsZombies.appModelsArena.SesionAppModel;
import araujoCoronelVillamayor.plantasVsZombies.domain.AtaqueLog;
import araujoCoronelVillamayor.plantasVsZombies.domain.Criatura;
import araujoCoronelVillamayor.plantasVsZombies.domain.Fila;
import araujoCoronelVillamayor.plantasVsZombies.domain.Planta;
import araujoCoronelVillamayor.plantasVsZombies.domain.Zombie;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.uqbar.commons.utils.Observable;

@Observable
@SuppressWarnings("all")
public class Ataque implements Serializable {
  private List<AtaqueLog> _coleccionDeLogs;
  
  public List<AtaqueLog> getColeccionDeLogs() {
    return this._coleccionDeLogs;
  }
  
  public void setColeccionDeLogs(final List<AtaqueLog> coleccionDeLogs) {
    this._coleccionDeLogs = coleccionDeLogs;
  }
  
  private SesionAppModel _sesionAppModel;
  
  public SesionAppModel getSesionAppModel() {
    return this._sesionAppModel;
  }
  
  public void setSesionAppModel(final SesionAppModel sesionAppModel) {
    this._sesionAppModel = sesionAppModel;
  }
  
  private Zombie zombie;
  
  private Fila fila;
  
  public Ataque(final Zombie zombieParametro, final Fila filaParametro, final SesionAppModel sesionAppModelParametro) {
    this.zombie = zombieParametro;
    this.fila = filaParametro;
    this.setSesionAppModel(sesionAppModelParametro);
    ArrayList<AtaqueLog> _arrayList = new ArrayList<AtaqueLog>();
    this.setColeccionDeLogs(_arrayList);
  }
  
  public void loopDeAtaque() {
    boolean _and = false;
    boolean _hayPlantas = this.fila.hayPlantas();
    if (!_hayPlantas) {
      _and = false;
    } else {
      boolean _tieneVida = this.zombie.tieneVida();
      _and = (_hayPlantas && _tieneVida);
    }
    boolean _while = _and;
    while (_while) {
      {
        Planta _ultimaPlanta = this.fila.ultimaPlanta();
        this.crearLogPreAtaque(this.zombie, _ultimaPlanta);
        Planta _ultimaPlanta_1 = this.fila.ultimaPlanta();
        this.zombie.ataca(_ultimaPlanta_1);
        Planta _ultimaPlanta_2 = this.fila.ultimaPlanta();
        this.crearLogPostAtaque(this.zombie, _ultimaPlanta_2);
        Planta _ultimaPlanta_3 = this.fila.ultimaPlanta();
        boolean _tieneVida_1 = _ultimaPlanta_3.tieneVida();
        if (_tieneVida_1) {
          Planta _ultimaPlanta_4 = this.fila.ultimaPlanta();
          this.crearLogPreAtaque(_ultimaPlanta_4, this.zombie);
          Planta _ultimaPlanta_5 = this.fila.ultimaPlanta();
          _ultimaPlanta_5.ataca(this.zombie);
          Planta _ultimaPlanta_6 = this.fila.ultimaPlanta();
          this.crearLogPostAtaque(_ultimaPlanta_6, this.zombie);
        } else {
          Planta _ultimaPlanta_7 = this.fila.ultimaPlanta();
          this.crearLogMuerte(_ultimaPlanta_7);
          this.crearLogGanador(this.zombie);
          Planta _ultimaPlanta_8 = this.fila.ultimaPlanta();
          this.fila.quitarPlanta(_ultimaPlanta_8);
        }
        this.evaluarResultadosAtaque(this.fila, this.zombie);
      }
      boolean _and_1 = false;
      boolean _hayPlantas_1 = this.fila.hayPlantas();
      if (!_hayPlantas_1) {
        _and_1 = false;
      } else {
        boolean _tieneVida_1 = this.zombie.tieneVida();
        _and_1 = (_hayPlantas_1 && _tieneVida_1);
      }
      _while = _and_1;
    }
  }
  
  public void evaluarResultadosAtaque(final Fila fila, final Zombie zombie) {
    boolean _hayPlantas = fila.hayPlantas();
    boolean _not = (!_hayPlantas);
    if (_not) {
      this.crearLogLlegoAMeta(zombie);
    }
    boolean _tieneVida = zombie.tieneVida();
    boolean _not_1 = (!_tieneVida);
    if (_not_1) {
      this.crearLogMuerte(zombie);
      Planta _ultimaPlanta = fila.ultimaPlanta();
      this.crearLogGanador(_ultimaPlanta);
      this.entregarPremio(zombie);
      SesionAppModel _sesionAppModel = this.getSesionAppModel();
      AtaqueAppModel _ataqueAppModel = _sesionAppModel.getAtaqueAppModel();
      List<Zombie> _zombies = _ataqueAppModel.getZombies();
      _zombies.remove(zombie);
      this.crearLogEntregaDePremio(zombie);
    }
  }
  
  public void entregarPremio(final Zombie zombie) {
    SesionAppModel _sesionAppModel = this.getSesionAppModel();
    int _premio = zombie.getPremio();
    _sesionAppModel.agregarRecursos(_premio);
  }
  
  public void crearLogLlegoAMeta(final Zombie zombie) {
    AtaqueLog _ataqueLog = new AtaqueLog();
    final AtaqueLog ataqueLogPaso = _ataqueLog;
    ataqueLogPaso.generarFinalLog(zombie);
    List<AtaqueLog> _coleccionDeLogs = this.getColeccionDeLogs();
    _coleccionDeLogs.add(ataqueLogPaso);
  }
  
  public void crearLogEntregaDePremio(final Zombie zombie) {
    AtaqueLog _ataqueLog = new AtaqueLog();
    final AtaqueLog ataqueLogPaso = _ataqueLog;
    ataqueLogPaso.generarEntregaPremio(zombie);
    List<AtaqueLog> _coleccionDeLogs = this.getColeccionDeLogs();
    _coleccionDeLogs.add(ataqueLogPaso);
  }
  
  public void crearLogPreAtaque(final Criatura atacante, final Criatura victima) {
    AtaqueLog _ataqueLog = new AtaqueLog();
    final AtaqueLog ataqueLogRegistro = _ataqueLog;
    ataqueLogRegistro.generarPreAtaqueLog(atacante, victima);
    List<AtaqueLog> _coleccionDeLogs = this.getColeccionDeLogs();
    _coleccionDeLogs.add(ataqueLogRegistro);
  }
  
  public void crearLogPostAtaque(final Criatura atacante, final Criatura victima) {
    AtaqueLog _ataqueLog = new AtaqueLog();
    final AtaqueLog ataqueLogRegistro = _ataqueLog;
    ataqueLogRegistro.generarPostAtaqueLog(atacante, victima);
    List<AtaqueLog> _coleccionDeLogs = this.getColeccionDeLogs();
    _coleccionDeLogs.add(ataqueLogRegistro);
  }
  
  public void crearLogMuerte(final Criatura muerto) {
    AtaqueLog _ataqueLog = new AtaqueLog();
    final AtaqueLog ataqueLogRegistro = _ataqueLog;
    ataqueLogRegistro.generarMuerteLog(muerto);
    List<AtaqueLog> _coleccionDeLogs = this.getColeccionDeLogs();
    _coleccionDeLogs.add(ataqueLogRegistro);
  }
  
  public void crearLogGanador(final Criatura ganador) {
    AtaqueLog _ataqueLog = new AtaqueLog();
    final AtaqueLog ataqueLogRegistro = _ataqueLog;
    ataqueLogRegistro.generarGanadorLog(ganador);
    List<AtaqueLog> _coleccionDeLogs = this.getColeccionDeLogs();
    _coleccionDeLogs.add(ataqueLogRegistro);
  }
}
